printing: Always get details of Avahi printers via IPP
authorMarek Kasik <mkasik@redhat.com>
Fri, 20 Feb 2015 10:11:01 +0000 (11:11 +0100)
committerMarek Kasik <mkasik@redhat.com>
Wed, 25 Feb 2015 14:58:23 +0000 (15:58 +0100)
Request details of Avahi browsed printers even when
we've got their PPDs already. Some options are not
present in PPD.

https://bugzilla.gnome.org/show_bug.cgi?id=743323

modules/printbackends/cups/gtkprintbackendcups.c

index b6425ea05304d88c17b91441f2323754f5ca35c8..00df2e4190ef40d10e3a0d980548bbab5187f6d2 100644 (file)
@@ -2614,15 +2614,10 @@ cups_request_printer_info_cb (GtkPrintBackendCups *cups_backend,
           set_info_state_message (info);
 
           printer = gtk_print_backend_find_printer (backend, info->printer_name);
-          if (printer != NULL &&
-              GTK_PRINTER_CUPS (printer)->ppd_file == NULL)
-            {
-              g_object_ref (printer);
-            }
+          if (printer != NULL)
+            g_object_ref (printer);
           else
-            {
-              goto done;
-            }
+            goto done;
 
           if (info->got_printer_type &&
               info->default_printer &&
@@ -3647,23 +3642,7 @@ cups_request_ppd_cb (GtkPrintBackendCups *print_backend,
   GTK_PRINTER_CUPS (printer)->reading_ppd = FALSE;
   print_backend->reading_ppds--;
 
-#ifdef HAVE_CUPS_API_1_6
-  fstat (g_io_channel_unix_get_fd (data->ppd_io), &data_info);
-  /* Standalone Avahi printers and raw printers don't have PPD files or have
-     empty PPD files. Try to get printer details via IPP. */
-  if (data_info.st_size == 0 ||
-      (gtk_cups_result_is_error (result) &&
-       (GTK_PRINTER_CUPS (printer)->avahi_browsed ||
-        ((gtk_cups_result_get_error_type (result) == GTK_CUPS_ERROR_HTTP) &&
-         (gtk_cups_result_get_error_status (result) == HTTP_NOT_FOUND)))))
-    {
-      cups_request_printer_info (GTK_PRINTER_CUPS (printer)->printer_uri,
-                                 GTK_PRINTER_CUPS (printer)->hostname,
-                                 GTK_PRINTER_CUPS (printer)->port,
-                                 GTK_PRINT_BACKEND_CUPS (gtk_printer_get_backend (printer)));
-      goto done;
-    }
-#else
+#ifndef HAVE_CUPS_API_1_6
   if (gtk_cups_result_is_error (result))
     {
       gboolean success = FALSE;
@@ -3683,12 +3662,36 @@ cups_request_ppd_cb (GtkPrintBackendCups *print_backend,
     }
 #endif
 
+  if (!gtk_cups_result_is_error (result))
+    {
+      /* let ppdOpenFd take over the ownership of the open file */
+      g_io_channel_seek_position (data->ppd_io, 0, G_SEEK_SET, NULL);
+      data->printer->ppd_file = ppdOpenFd (dup (g_io_channel_unix_get_fd (data->ppd_io)));
+      ppdLocalize (data->printer->ppd_file);
+      ppdMarkDefaults (data->printer->ppd_file);
+    }
 
-  /* let ppdOpenFd take over the ownership of the open file */
-  g_io_channel_seek_position (data->ppd_io, 0, G_SEEK_SET, NULL);
-  data->printer->ppd_file = ppdOpenFd (dup (g_io_channel_unix_get_fd (data->ppd_io)));
-  ppdLocalize (data->printer->ppd_file);
-  ppdMarkDefaults (data->printer->ppd_file);
+#ifdef HAVE_CUPS_API_1_6
+  fstat (g_io_channel_unix_get_fd (data->ppd_io), &data_info);
+  /*
+   * Standalone Avahi printers and raw printers don't have PPD files or have
+   * empty PPD files. Try to get printer details via IPP.
+   * Always do this for Avahi printers.
+   */
+  if (data_info.st_size == 0 ||
+      GTK_PRINTER_CUPS (printer)->avahi_browsed ||
+      (gtk_cups_result_is_error (result) &&
+       ((gtk_cups_result_get_error_type (result) == GTK_CUPS_ERROR_HTTP) &&
+         (gtk_cups_result_get_error_status (result) == HTTP_NOT_FOUND))))
+    {
+      cups_request_printer_info (GTK_PRINTER_CUPS (printer)->printer_uri,
+                                 GTK_PRINTER_CUPS (printer)->hostname,
+                                 GTK_PRINTER_CUPS (printer)->port,
+                                 GTK_PRINT_BACKEND_CUPS (gtk_printer_get_backend (printer)));
+
+      goto done;
+    }
+#endif
 
   gtk_printer_set_has_details (printer, TRUE);
   g_signal_emit_by_name (printer, "details-acquired", TRUE);